﻿/************************************************************************

   Extended Silverlight Toolkit

   Copyright (C) 2010-2012 Xceed Software Inc.

   This program is provided to you under the terms of the Microsoft Public
   License (Ms-PL) as published at http://extendedsilverlight.codeplex.com/license

   Please purchase a commercial version of this toolkit if you are using
   it in a commercial product. The commercial versions support the project,
   and also include more features for each control, priority support,
   source code, updates, removed watermark, and a proprietary license.

   Visit http://xceed.com and follow @datagrid on Twitter.

  **********************************************************************/

using System;
using System.Windows.Input;

namespace Xceed.Silverlight.DataGrid
{
  internal abstract class KeyHandler
  {
    #region Static Fields

    internal static readonly KeyHandler Default = new LastSuccessor();

    #endregion

    #region Constructor

    private KeyHandler()
    {
    }

    protected KeyHandler( KeyHandler successor )
    {
      if( successor == null )
        throw new ArgumentNullException( "successor" );

      m_successor = successor;
    }

    #endregion

    #region Successor Private Property

    private KeyHandler Successor
    {
      get
      {
        return m_successor;
      }
    }

    private readonly KeyHandler m_successor;

    #endregion

    protected abstract void Handle( KeyEventArgs e );

    internal void HandleRequest( KeyEventArgs e )
    {
      if( e.Handled )
        return;

      this.Handle( e );

      var successor = this.Successor;
      if( successor != null )
      {
        successor.HandleRequest( e );
      }
    }

    #region LastSuccessor Nested Type

    private sealed class LastSuccessor : KeyHandler
    {
      internal LastSuccessor()
      {
      }

      protected override void Handle( KeyEventArgs e )
      {
      }
    }

    #endregion
  }
}
